package linkedList.双指针;

import po.ListNode;

/**
 * @author songZiHao
 * @version 1.0.0
 * @ClassName 删除链表的倒数第N个结点19.java
 * @Description TODO https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
 * @createTime 2021年03月09日 16:27:00
 */
public class 删除链表的倒数第N个结点19 {

    /**
     * 给你一个链表，删除链表的倒数第 n 个结点，并且返回链表的头结点
     * 你能尝试使用一趟扫描实现吗？
     */

    public static ListNode removeNthFromEnd(ListNode head, int n) {
        //创建一个头结点，然后第一个指针指向这个节点的作用，当第二个指针为空的时候，第一个指针正好指向删除的节点的前面一个节点
        ListNode temp = new ListNode(0,head);
        ListNode firstPoint = head, secondPoint = temp;
        for (int i = 0; i < n; i++) {
            firstPoint = firstPoint.next;
        }
        //循环到第二个指针的下一个节点为null
        while (firstPoint != null) {
            firstPoint = firstPoint.next;
            secondPoint = secondPoint.next;
        }
        secondPoint.next = secondPoint.next.next;
        return temp.next;

    }

    public static void main(String[] args) {
        ListNode listNode1 = new ListNode(1);
        ListNode listNode2 = new ListNode(2);
        ListNode listNode3 = new ListNode(3);
        ListNode listNode4 = new ListNode(4);
        ListNode listNode5 = new ListNode(5);
        listNode1.next = listNode2;
        listNode2.next = listNode3;
        listNode3.next = listNode4;
        listNode4.next = listNode5;
        ListNode node = removeNthFromEnd(listNode1, 2);

    }
}
